<?php if( ! defined('BASEPATH')) exit('No direct script access allowed');
//通过总控制器过滤数据，控制安全，去除重复，控制全局。
class MY_Controller extends CI_Controller {
	protected $_data = array();			//我通过处理得到，要向页面展示的数据。
	/*
	 *	用户的任何访问必先经过这里。因此在这里进行用户数据处理，一般为URL或FORM表单数据。
	 *	这些数据存在于所有的控制器，并能够方便的传入所有的模型中，并以此为条件操作数据库。
	 *	但这些数据不能或很难直接用到视图页面中。
	 *	视图中用到的是从数据库中取得的数据。 
	 */
	protected $c_data = array();		//经过处理的，客户端传来的数据。
	
	protected $tbl_news = 'news';		//数据库中所有的表名属性化，便于日后更改名称。
	protected $tbl_cat = 'cat';
	protected $tbl_img = 'img';
	protected $tbl_product = 'product';
	protected $tbl_product_img = 'product_img';
	
	protected $tbl;                    //所有的表名的对象集合
	
	
	/*
	 *     1.所有表名属性化：$this->tbl,所有控制器可用
	 *     2.用户数据通用处理：$this->c_data
	 *     3.加载cm sys模型
	 *     4.登录验证
	 *     5.存储动态导航数据：$this->_data
	 */
    function __construct(){
        parent::__construct();
        $this->tbl = (object)config_item('tbl');
        
        //得到静态内容的URL,如此全局可用，如同常量一般。可以直接定义成常量。
        $this->_data['static_url'] = $this->config->item('base_url').'admin/statics/';

        /*
         *     用户数据通用处理，所有客户端传来的数据在此收集，$this->c_data全局使用。
         *     input类是系统自动加载，直接可用
         */
        $data_get = $this->input->get(NULL,TRUE);       
        $data_post = $this->input->post(NULL,TRUE);
        
        if(!empty($data_get) && !empty($data_post)){
        	$data_request = array_merge($data_get,$data_post);
        }elseif (!empty($data_get) && empty($data_post)){
        	$data_request = $data_get;
        }else{
        	$data_request = $data_post;
        }
        
        $this->c_data = $data_request;
        
 
        //加载通用模型，也即是MY_Model的变身。确保公用模型在所有控制器和方法中都可用。
        $this->load->model('common_model','cm');
        //加载系统模型，以备登录验证，生成导航
        $this->load->model('sys_model','sys');
        
        
        //加载session，也可在配置中自动加载
        $this->load->library('session');        
        /*
         *     登录检测
         *     $excepter:排除无需检测的url，若检测会造成死循环。
         */
        $excepter = array('sys^login','sys^login_do','product^uploadify');
        if(!except($excepter)){
            if(!$this->sys->is_login())
                   redirect(site_url('c=sys&m=login'));
        }
        
        //读取菜单       
        $top_menu = $this->sys->get_top_menu();
        $this->_data['top_menu'] = $top_menu;
        $current_top_menu = $this->cm->row($this->tbl->menu,array('c'=>get_c(),'pid'=>0));
        $slide_menu = $this->sys->get_slide_menu($current_top_menu->id);
        $this->_data['slide_menu'] = $slide_menu;
    }
    
    
    
    //处理文本编辑区域，即textarea标签内的图片上传。返回图片的URL.
    function upload(){
    	//借助外部力量，引入thumb图像处理类，此类可使图片缩放不变形。
    	require_once LIBPATH.'thumb/ThumbLib.inc.php';		//加载衔接文档
    	//预备必需原料。
    	$tempPath = '';
    	$extname = '';		//取得文件扩展名，以备为新图片取个新名字
    	if(isset($_SERVER['HTTP_CONTENT_DISPOSITION'])&&preg_match('/attachment;\s+name="(.+?)";\s+filename="(.+?)"/i',$_SERVER['HTTP_CONTENT_DISPOSITION'],$info)){//HTML5上传
    		
    		$fileinfo = $_SERVER['HTTP_CONTENT_DISPOSITION'];
    		$arr_fileinfo = explode(';',$fileinfo);
    		$arr_t2 = explode('.', $arr_fileinfo[2]);
    		$extname = trim($arr_t2[count($arr_t2)-1],'"');
    		
    		$tempPath=PICPATH.'/temp.tmp';
    		file_put_contents($tempPath,file_get_contents("php://input"));
    	} else{
    		//标准表单式上传
    		$tempPath=@$_FILES['filedata']['tmp_name'];
    		$old_filename = @$_FILES['filedata']['name'];
    		$arr_t = explode('.', $old_filename);
    		$extname = $arr_t[count($arr_t)-1];
    	}

    	$extname = strtolower($extname);
    	$config = config_item('editor');
    	
    	
    	
    	//判断文件类型
    	if(!in_array($extname,$config['upload_type'])){
    		echo json_encode(array(
    				'err'=>'文件类型错误！',
    				'msg'=> ''
    		));
    		exit;
    	}
    	
    	//判断文件大小
    	$filesize = filesize($tempPath);
    	if($filesize>($config['sizelimit'])){
    		echo json_encode(array(
    				'err'=>'文件太大！',
    				'msg'=> ''
    		));
    		exit;
    	}
    	
    	$filename = creat_file_rand_name().'.'.$extname;
    	
    	$filepath = PICPATH.'others\\'.$filename;
    	
    	$thumb = PhpThumbFactory::create($tempPath);
    	$thumb->resize($config['maxwidth']);
    	$thumb->save($filepath);
    	
    	$imgurl = PICURL.'others/'.$filename;
    	//xheditor插件规定的格式'err'=>?,'msg'=>?
    	echo json_encode(array(
    			'err'=>'',
    			'msg'=> $imgurl
    	));
    	exit;
    }
    //使用了uploadify插件，以ajax的方式进行图片上传。先一步处理。
    function uploadify(){

    	//只加载一个文件就可以用 thumb 类吗？
    	require_once LIBPATH.'thumb/ThumbLib.inc.php';

    	//需要源文件（即上传来的临时文件）和目标文件。上传即告成功。
    	$tempPath = '';
    	$extname = '';
    	//获得上传的临时文件及后缀名。
    	$tempPath=@$_FILES['Filedata']['tmp_name'];

    	$old_filename = @$_FILES['Filedata']['name'];
    	$arr_t = explode('.', $old_filename);
    	$extname = $arr_t[count($arr_t)-1];   	
    	$extname = strtolower($extname);
    	
    	//获取有关图片上传的配置信息,myconfig配置信息已经启用了自动加载。不用再$this->load->config('myconfig');
    	$config = config_item('product');		//使用config_item函数取配置文件的数据。
    											//也可用$this->config->item('product');

    	//判断文件类型
    	if(!in_array($extname,$config['upload_type'])) die;
    	 
    	//判断文件大小
    	$filesize = $_FILES['Filedata']['size'];
    	if($filesize>($config['sizelimit'])) die;
    	 
    	//调用随机名生成函数，获得生成图片的名字,用了日期加微秒的形式。可保证不重复。
    	$filename = creat_file_rand_name().'.'.$extname;
    	 
    	//预备生成的大图与小图的全路径
    	$filepath = PICPATH.'product/'.$filename;
    	$thumbpath =  PICPATH.'product/s/'.$filename;
    	
    	//调用thumb类的方法，生成图像
    	$thumb = PhpThumbFactory::create($tempPath);//源文件
    	$thumb->resize($config['maxwidth']);//对图像大小的要求
    	$thumb->save($filepath);			//有了全路径，那就生成图像吧
    	 
    	//再次调用thumb类，生成一个固定大小的缩略图
		$thumb = PhpThumbFactory::create($tempPath);//还是那个源文件
		$thumb->adaptiveResize($config['w'], $config['h']);//对图像尺寸新的要求
		$thumb->save($thumbpath);						//再给个新的全路径
    	    	 
    	$imgurl = PICURL.'product/s/'.$filename;  
    	  	
    	$data['path'] = UPLOAD_DIR.'/pic/product/'.$filename;
    	$data['spath'] = UPLOAD_DIR.'/pic/product/s/'.$filename;
    	$data['atime'] = mktime();
    	$id = $this->cm->save($this->tbl_img,$data); 
    	//返回的数据时json化的字符串。
    	echo json_encode(array('id'=>$id,'thumb_url'=>$imgurl));
    	exit;
    }
    /*
     * 获得页面的全部URL信息，赋给分页类必需配置项：$config['base_url'];
     * 因所有的控制器调用的页面都有可能用到分页，
     * 且需用到$this->c_data里面的数据，因此写在这里。
     */ 
    function page_url(){
    	if(!empty($this->c_data) && is_array($this->c_data)){
    		unset($this->c_data['per_page']);
    		$arr_p = array();
    		foreach ($this->c_data as $k=>$v){
    			$arr_p[] = $k.'='.$v;
    		}
    		return site_url(implode('&', $arr_p));
    	}else{
    		
    		return site_url();
    	}
    	
    }
    
}
